'use strict'
// 导入托盘Tray模块以及Menu菜单模块
import { app, protocol, BrowserWindow, Tray, Menu, ipcMain, webContents } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
const path = require('path')
// import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
const isDevelopment = process.env.NODE_ENV !== 'production'
// 获取软件图标
const iconPath = path.join(__static, 'icon.png') // ~~~注意有可能打包问题~~~
// 导入udp接收客户端
const dgram = require('dgram')
const client = dgram.createSocket('udp4')
let win
let tray
// 在应用程序准备就绪之前，必须注册方案
protocol.registerSchemesAsPrivileged([{ scheme: 'app', privileges: { secure: true, standard: true } }])

// 定义菜单Menu模版
const template = [
	{
		label: '文件',
		submenu: [
			{
				label: '退出',
				role: 'quit',
			},
		],
	},
]

// 创建udp客户端-并使用win.webContents发生数据给渲染进程
function createudpclient() {
	client.on('listening', function () {
		let address = client.address()
		console.log('udp客户端开启,开始接收数据...', address)
	})
	client.on('message', (msg, remoteInfo) => {
		// node环境下先JSON解析后再给前端
		let msgObjArray = JSON.parse(msg)

		if (msgObjArray.hasOwnProperty('resCount')) {
			win.webContents.send('udpLocal', msgObjArray)
		} else {
			// 判断valid是否为1
			if (msgObjArray[0] && msgObjArray[0].valid === '1') {
				win.webContents.send('udp', msgObjArray[0])
			}
			if (msgObjArray[1] && msgObjArray[1].valid === '1') {
				setTimeout(() => {
					win.webContents.send('udp', msgObjArray[1])
				}, 3000)
			}
		}
	})
	client.on('error', (err) => {
		console.log(`udp客户端报错:${err}`)
	})
	// 绑定端口号-固定不改
	client.bind(8912)
}

// 创建窗口函数
async function createWindow() {
	// 创建浏览器窗口
	win = new BrowserWindow({
		width: 1200,
		height: 800,
		webPreferences: {
			// 使用pluginOptions.nodeIntegration不要管他
			nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
			contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
			// 应用软件图标设置
			icon: path.join(__dirname, './static/appicon.ico'),
			// webviewTag: true,
			preload: path.join(__dirname, 'preload.js'),
		},
		// 是否开启无窗模式
		// frame: false,
	})

	if (process.env.WEBPACK_DEV_SERVER_URL) {
		// 如果处于开发模式，则加载开发服务器的url
		await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
		if (!process.env.IS_TEST) win.webContents.openDevTools()
	} else {
		createProtocol('app')
		// 未开发时加载index.html
		win.loadURL('app://./index.html')
	}
}

// 关闭所有窗口后退出
app.on('window-all-closed', () => {
	// 在macOS上，应用程序及其菜单栏很常见
	// 保持活动状态，直到用户使用Cmd+Q明确退出
	if (process.platform !== 'darwin') {
		app.quit()
	}
})

app.on('activate', () => {
	// 在macOS上，当单击停靠图标且没有其他窗口打开时，通常会在应用程序中重新创建一个窗口
	if (BrowserWindow.getAllWindows().length === 0) createWindow()
})

// 此方法将在Electron完成后调用
// 初始化，并准备创建浏览器窗口
// 某些API只能在此事件发生后使用
app.on('ready', async () => {
	if (isDevelopment && !process.env.IS_TEST) {
		// 直接不加载devtools
	}
	// 实例化Tray对象
	tray = new Tray(iconPath)
	tray.setToolTip('实时定位数据展示软件')
	// 点击托盘图标
	tray.on('click', () => {
		// 根据现在win的显示情况隐藏或者显示
		if (win.isVisible()) {
			win.hide()
		} else {
			win.show()
		}
	})
	// 右键出现的菜单，通过Menu.buildFromTemplate定制，这里只包含退出程序的选项
	tray.on('right-click', () => {
		const menuConfig = Menu.buildFromTemplate([
			{
				label: '退出',
				click: () => app.quit(),
			},
		])
		tray.popUpContextMenu(menuConfig)
	})
	// 根据菜单Menu模版初始化菜单-只在开发环境
	if (!isDevelopment && !process.env.IS_TEST) {
		const appMenu = Menu.buildFromTemplate(template)
		Menu.setApplicationMenu(appMenu)
	}

	// 运行启动udp客户端
	createudpclient()
	createWindow()
})

// 在开发模式下，应父进程的请求干净地退出
if (isDevelopment) {
	if (process.platform === 'win32') {
		process.on('message', (data) => {
			if (data === 'graceful-exit') {
				app.quit()
			}
		})
	} else {
		process.on('SIGTERM', () => {
			app.quit()
		})
	}
}

//~~~~~~~~~~~ipcMain通信相关~~~~~~~~~~~
